import vue from "@vitejs/plugin-vue";
import { defineConfig } from "vite";

import { fileURLToPath, URL } from "node:url";

import UnoCSS from "unocss/vite";

import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import Icons from "unplugin-icons/vite";
import IconsResolver from "unplugin-icons/resolver";

import ElementPlus from "unplugin-element-plus/vite";
//ElementPlus按需导入，打包后，国际化存在问题.
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";

import libAssets from "@laynezh/vite-plugin-lib-assets";

// https://vitejs.dev/config/
export default defineConfig({
  build: {
    // 库模式配置
    lib: {
      // 入口文件
      entry: "./src/index.ts",
      // ESModule模式
      formats: ["es"],
      // 输出的文件名
      fileName: "index",
    },
    rollupOptions: {
      // 外部化处理那些你不想打包进库的依赖
      external: [
        "vue",
        "vue-i18n",
        "vue-router",
        "pinia",
        "element-plus",
        "axios",
      ],
      output: {
        // 为外部化的依赖提供一个全局变量
        globals: {
          vue: "Vue",
        },
      },
    },
  },
  css: {
    // CSS 预处理器
    preprocessorOptions: {
      // 定义全局 SCSS 变量
      scss: {
        javascriptEnabled: true,
        additionalData: `
          @use "@/styles/variables.scss" as *;
        `,
        api: "modern-compiler",
      },
    },
  },
  plugins: [
    vue(),
    UnoCSS({
      hmrTopLevelAwait: false,
    }),
    ElementPlus({}),
    // 自动导入参考： https://github.com/sxzz/element-plus-best-practices/blob/main/vite.config.ts
    AutoImport({
      // 自动导入 Vue 相关函数，如：ref, reactive, toRef 等
      imports: ["vue", "@vueuse/core"],
      resolvers: [
        ElementPlusResolver(),
        // 自动导入图标组件
        IconsResolver({}),
      ],
      eslintrc: {
        // 是否自动生成 eslint 规则，建议生成之后设置 false
        enabled: false,
        // 指定自动导入函数 eslint 规则的文件
        filepath: "./.eslintrc-auto-import.json",
        globalsPropValue: true,
      },
      // 是否在 vue 模板中自动导入
      vueTemplate: true,
      // 指定自动导入函数TS类型声明文件路径 (false:关闭自动生成)
      dts: true,
    }),
    Components({
      resolvers: [
        // 自动注册图标组件
        IconsResolver({
          // element-plus图标库，其他图标库 https://icon-sets.iconify.design/
          enabledCollections: ["ep"],
        }),
      ],
      // 指定自定义组件位置(默认:src/components)
      dirs: ["src/components", "src/**/components"],
      // 指定自动导入组件TS类型声明文件路径 (false:关闭自动生成)
      dts: true,
    }),
    Icons({
      // 自动安装图标库
      autoInstall: true,
    }),
    libAssets(),
  ],
  // 预加载项目必需的组件
  optimizeDeps: {
    include: [
      "vue",
      "vue-router",
      "pinia",
      "axios",
      "@vueuse/core",
      "sortablejs",
      "path-to-regexp",
      "echarts",
      "vue-i18n",
      "path-browserify",
      "element-plus/es/components/form/style/css",
      "element-plus/es/components/form-item/style/css",
      "element-plus/es/components/button/style/css",
      "element-plus/es/components/input/style/css",
      "element-plus/es/components/input-number/style/css",
      "element-plus/es/components/switch/style/css",
      "element-plus/es/components/upload/style/css",
      "element-plus/es/components/menu/style/css",
      "element-plus/es/components/col/style/css",
      "element-plus/es/components/icon/style/css",
      "element-plus/es/components/row/style/css",
      "element-plus/es/components/tag/style/css",
      "element-plus/es/components/dialog/style/css",
      "element-plus/es/components/loading/style/css",
      "element-plus/es/components/radio/style/css",
      "element-plus/es/components/radio-group/style/css",
      "element-plus/es/components/popover/style/css",
      "element-plus/es/components/scrollbar/style/css",
      "element-plus/es/components/tooltip/style/css",
      "element-plus/es/components/dropdown/style/css",
      "element-plus/es/components/dropdown-menu/style/css",
      "element-plus/es/components/dropdown-item/style/css",
      "element-plus/es/components/sub-menu/style/css",
      "element-plus/es/components/menu-item/style/css",
      "element-plus/es/components/divider/style/css",
      "element-plus/es/components/card/style/css",
      "element-plus/es/components/link/style/css",
      "element-plus/es/components/breadcrumb/style/css",
      "element-plus/es/components/breadcrumb-item/style/css",
      "element-plus/es/components/table/style/css",
      "element-plus/es/components/tree-select/style/css",
      "element-plus/es/components/table-column/style/css",
      "element-plus/es/components/select/style/css",
      "element-plus/es/components/option/style/css",
      "element-plus/es/components/pagination/style/css",
      "element-plus/es/components/tree/style/css",
      "element-plus/es/components/alert/style/css",
      "element-plus/es/components/radio-button/style/css",
      "element-plus/es/components/checkbox-group/style/css",
      "element-plus/es/components/checkbox/style/css",
      "element-plus/es/components/tabs/style/css",
      "element-plus/es/components/tab-pane/style/css",
      "element-plus/es/components/rate/style/css",
      "element-plus/es/components/date-picker/style/css",
      "element-plus/es/components/notification/style/css",
      "element-plus/es/components/image/style/css",
      "element-plus/es/components/statistic/style/css",
      "element-plus/es/components/watermark/style/css",
      "element-plus/es/components/config-provider/style/css",
      "element-plus/es/components/text/style/css",
      "element-plus/es/components/drawer/style/css",
      "element-plus/es/components/color-picker/style/css",
    ],
  },
  resolve: {
    alias: {
      "@": fileURLToPath(new URL("./src", import.meta.url)),
    },
  },
  server: {
    host: true,
  },
});
